﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace Model
{
    [Serializable()]
    public class POI : ISerializable
    {
        private Point plaats;
        public Point Plaats { get { return plaats; } set { plaats = value; } }
        private int nummer;
        private List<Kind> kinderen;
        private List<Artikel> artikelen;
        private bool doorlopen;

        public POI(Point p, int nummer)
        {
            this.kinderen = new List<Kind>();
            this.plaats = p;
            this.nummer = nummer;
            Artikelen = new List<Artikel>();
            Doorlopen = false;
        }

        public POI(POI kopie)
        {
            this.plaats = new Point(kopie.Plaats.X, kopie.Plaats.Y);
            this.nummer = kopie.Nummer;
            this.kinderen = new List<Kind>();
            this.kinderen.AddRange(kopie.Kinderen);
            artikelen = new List<Artikel>();
            artikelen.AddRange(kopie.Artikelen);
            this.doorlopen = kopie.Doorlopen;
        }

        public POI(int x, int y, int nummer)
            : this(new Point(x, y), nummer)
        {
        }

        public POI(SerializationInfo info, StreamingContext ctxt)
        {
            plaats = (Point)info.GetValue("Plaats", typeof(Point));
            nummer = (int)info.GetValue("Nummer", typeof(int));
            kinderen = (List<Kind>)info.GetValue("Kinderen", typeof(List<Kind>));
            artikelen = (List<Artikel>)info.GetValue("Artikelen", typeof(List<Artikel>));
            doorlopen = (bool)info.GetValue("Doorlopen", typeof(bool));
        }

        public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
        {
            info.AddValue("Plaats", this.plaats);
            info.AddValue("Nummer", this.nummer);
            info.AddValue("Kinderen", this.kinderen);
            info.AddValue("Artikelen", this.artikelen);
            info.AddValue("Doorlopen", this.doorlopen);
        }

        /// <summary>
        /// De kinderen
        /// </summary>
        public List<Kind> Kinderen
        {
            get { return kinderen; }
        }

        public List<Artikel> Artikelen
        {
            get { return artikelen; }
            set { artikelen = value; }
        }

        public bool Doorlopen
        {
            get { return doorlopen; }
            set { doorlopen = value; }
        }

        public int Nummer
        {
            get { return nummer; }
        }

        /// <summary>
        /// Voegt een kind toe
        /// </summary>
        /// <param name="kind">Het toe te voegen kind</param>
        public void VoegKindToe(Kind kind)
        {
            Kinderen.Add(kind);
        }
    }

    [Serializable()]
    public class Kind : ISerializable
    {
        private int nummer;
        private int afstand;

        public Kind(int nummer, int afstand)
        {
            this.nummer = nummer;
            this.afstand = afstand;
        }

        public Kind(SerializationInfo info, StreamingContext ctxt)
        {
            nummer = (int)info.GetValue("Nummer", typeof(int));
            afstand = (int)info.GetValue("Afstand", typeof(int));
        }


        public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
        {
            info.AddValue("Nummer", this.nummer);
            info.AddValue("Afstand", this.afstand);
        }

        /// <summary>
        /// De afstand van het kind
        /// </summary>
        public int Afstand
        {
            get { return afstand; }
        }

        /// <summary>
        /// Het nummer van het kind
        /// </summary>
        public int Nummer
        {
            get { return nummer; }
        }



    }

}
